// 路由鉴权 进度条业务
import router from ".";
// @ts-ignore
import nprogress from 'nprogress'
// 引入进度条样式
import 'nprogress/nprogress.css'
// 引入仓库
import useUserStore from "../store/modules/user";
import pinia from '../store'
import setting from '../setting'
import { ElMessage } from "element-plus";
// import { ElMessage } from "element-plus";
let userStore = useUserStore(pinia)
nprogress.configure({ showSpinner: false })

// 前置路由守卫
router.beforeEach(async (to, from, next) => {
    document.title = setting.title + '-' + to.meta.title
    // 设置浏览器标题
    nprogress.start();
    let token = userStore.token
    let username = userStore.username
    if (token) {
        // 用户登录
        if (to.path == '/login') {
            next({ path: '/' })
        } else {
            // 有用户信息
            if (username) {
                next()
            } else {
                // 没有用户信息 则发请求获取用户信息 再放行
                try {
                    await userStore.userInfo()
                    // 刷新的时候 当前路由是异步路由，获取到了用户信息 但是异步路由未加载完毕
                    // 所以要确保 获取到用户信息之后 异步路由也加载完毕才可以放行
                    next({ ...to });
                } catch (error) {
                    // token过期 获取不到用户信息
                    // 用户手动修改本地存储的token 退出登录
                    await userStore.userLoginout()

                    next({
                        path: '/login',
                        query: {
                            redirect: to.path
                        }
                    })
                    let err: any = error
                    ElMessage({
                        type: 'error',
                        message: err
                    })
                }

            }

        }

    } else {
        // 用户未登录
        if (to.path == '/login') {
            next()
        } else {
            next({
                path: '/login',
                query: {
                    redirect: to.path
                }
            })
        }
    }
})

// 后置路由首位
router.afterEach((to, from) => {
    // to and from are both route objects.
    nprogress.done();

})
